#ifndef GNSS_API_H
#define GNSS_API_H

#include "baseTask.h"
#include "../tool/configManage.h"
#include "../device/rtkDevice.h"
#include <iostream>
#include <thread>
#include <unistd.h> // 引入 usleep()
#include "../include/tool/log.h"
typedef struct
{
    uint32_t rtcmLen; 
    uint8_t rtcmData[512]; // 储存rtcm数据内容
    /* data */
}Rtcm_Date;

typedef struct
{
    uint32_t bufLen;
    uint8_t recvBuf[200];
}GnssRecvBuf;

// $GNGGA,030336.60,3040.25368,N,10406.42450,E,4,12,1.18,587.7,M,-29.8,M,1.4,0000*4E
typedef struct{
    double time;                 // 字段1：UTC 时间，hhmmss.sss，时分秒格式
    double latitude;             // 字段2：纬度ddmm.mmmm，度分格式（前导位数不足则补0）
    std::string latitudeRange;  // 字段3：纬度N（北纬）或S（南纬）
    double longitude;            // 字段4：经度dddmm.mmmm，度分格式（前导位数不足则补0）
    std::string longitudeRange; // 字段5：经度E（东经）或W（西经）
    int gpsStatus;          // 字段6：GPS状态，0=未定位，1=非差分定位，2=差分定位，3=无效PPS，6=正在估算
    int startNum;           // 字段7：正在使用的卫星数量（00 - 12）（前导位数不足则补0）
    double precision;    // 字段8：HDOP水平精度因子（0.5 - 99.9）
    double altitude;    // 字段9：海拔高度（-9999.9 - 99999.9）
    double geoidHeight;   // 字段10：地球椭球面相对大地水准面的高度
        // 字段11：差分时间（从最近一次接收到差分信号开始的秒数，如果不是差分定位将为空）
        // 字段12：差分站ID号0000 - 1023（前导位数不足则补0，如果不是差分定位将为空）
        // 字段13：校验值
}S_GNGGA;

class C_gnssApi : public C_baseTask
{
private:
    /* data */
    std::string task_name;
    int task_period;
    std::string task_topic;
    
    Rtcm_Date m_rtcmData;
    C_rtkDevice *p_rtkDevice;
    GnssRecvBuf *m_gnssRecvBuf;

    /* function */
    int32_t recvRTCMdata(void);
    int32_t recvGnssData(std::vector<uint8_t> &gnssBufStr);
    void transmitRtcm(void);
    
    // std::vector<std::string> split(std::string str, std::string pattern);
    // double changeData(double data);
public:

    C_gnssApi(/* args */);
    ~C_gnssApi();
    int32_t parseGnssData(std::vector<uint8_t> &gnssBufStr, S_GNGGA &gnggaData);
    int32_t parseGnssData(std::string &str, S_GNGGA &gnggaData);
    int32_t initTask(CONFIG_GNSS &config_gnss);
    void runLoopTask(void);
};

/********************************************************************
 * @author: tianxiaohuahua
 * @date: 23.8
 * @description: 判断输入的字符串是不是全是数字，整数或者小数的形式
 * @input: 字符串
 * @return: 是否是数字
*******************************************************************/
bool judgeStrToInt(std::string &str);// 判断字符串

/********************************************************************
 * @author: tianxiaohuahua
 * @date: 23.8
 * @description: 将接收到的GNSS定位数据转换为经纬度数据
 * @input: data 直接获取到的经纬度的数据 四位数的小数
 * @return: data_ 转换后的数据
*******************************************************************/
double changeData(double data);

/********************************************************************
 * @author: tianxiaohuahua
 * @date: 23.8
 * @description: 字符串分割函数
 * @reference: https://blog.csdn.net/birenxiaofeigg/article/details/115464934
 * @input: void
 * @return: void
*******************************************************************/
std::vector<std::string> split(std::string str, std::string pattern);
#endif
